package org.shj.pattern.chainresponsibility

/**
 * 职责链模式：
 * 意图： 避免请求发送者与接收者耦合在一起，让多个对象都有可能接收请求，将这些对象连接成一条链，
 * 			并且沿着这条链传递请求，直到有对象处理它为止
 * 主要解决： 职责链上的处理者负责处理请求，客户只需要将请求发送到职责链上即可，无须关心请求的处理
 *      细节和请求的传递，所以职责链将请求的发送者和处理者解耦了
 * 应用实例： 1. JS中的事件冒泡  2. Structs2的拦截器   3. jsp servlet的filter 等
 * 优点： 1. 简化了对象。使得对象不需要知道链的结构。 2. 增强给对象指派职责的灵活性。通过改变链内的
 *      成员或者调用它们的次序，允许动态地新增或者删除责任。 3. 增加新的请求处理类很方便
 * 缺点： 1. 有多个对象可以处理同一个请求，具体哪个对象处理该请求由运行时刻自动确定。 
 *      2. 在不明确指定接收者的情况下，向多个对象中的一个提交一个请求
 *      3. 可动态指定一组对象处理请求
 */
object ChainMain {
  def main(args: Array[String]): Unit = {
    val tl = new TeamLeader
    val pm = new PM
    val boss = new Boss
    
    tl.successor = pm
    pm.successor = boss
    
    tl.approveRaiseSalary(200)
    
    tl.successor = boss //职责链中，客户端可以自定义下一个能处理的对象
    tl.approveRaiseSalary(2000)
    
  }
}